home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / PublicDomain / Spiele / TextElite / Original / txtelite.c < prev   
C/C++ Source or Header  |  2000-02-26  |  20KB  |  741 lines

  1. /* txtelite.c */
  2. /* Textual version of Elite trading (C implementation) */
  3. /* Converted by Ian Bell from 6502 Elite sources.
  4.    Original 6502 Elite by Ian Bell & David Braben. */
  5.  
  6.  
  7. /* ----------------------------------------------------------------------
  8.   The nature of basic mechanisms used to generate the Elite socio-economic
  9. universe are now widely known. A competant games programmer should be able to
  10. produce equivalent functionality. A competant hacker should be able to lift 
  11. the exact system from the object code base of official conversions.
  12.  
  13.   This file may be regarded as defining the Classic Elite universe.
  14.  
  15.   It contains a C implementation of the precise 6502 algorithms used in the
  16.  original BBC Micro version of Acornsoft Elite together with a parsed textual
  17.  command testbed.
  18.  
  19.   Note that this is not the universe of David Braben's 'Frontier' series.
  20.  
  21.  
  22. ICGB 13/10/99
  23. iancgbell@email.com
  24. www.ibell.co.uk
  25.   ---------------------------------------------------------------------- */
  26.  
  27.  
  28. /* Note that this program is "quick-hack" text parser-driven version
  29. of Elite with no combat or missions.
  30. */
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <time.h>
  36. #include <math.h>
  37.  
  38. #if 0
  39. #include <conio.h>
  40. #include <graph.h>
  41. #include <malloc.h>
  42. #endif
  43.  
  44. #define true (-1)
  45. #define false (0)
  46. #define tonnes (0)
  47.  
  48. #define maxlen (20) /* Length of strings */
  49.  
  50. typedef int boolean;
  51. typedef unsigned short uint16;
  52. typedef signed short int16;
  53. typedef signed long int32;
  54.  
  55. typedef uint16 uint;
  56.  
  57. typedef int planetnum;
  58.  
  59. typedef struct
  60. { uint16 w0;
  61.   uint16 w1;
  62.   uint16 w2;
  63. } seedtype;  /* six byte random number used as seed for planets */
  64.  
  65. typedef struct
  66. {     uint x;
  67.    uint y;       /* One byte unsigned */
  68.    uint economy; /* These two are actually only 0-7  */
  69.    uint govtype;   
  70.    uint techlev; /* 0-16 i think */
  71.    uint population;   /* One byte */
  72.    uint productivity; /* Two byte */
  73.    uint radius; /* Two byte (not used by game at all) */
  74.    char name[12];
  75. } plansys ;
  76.  
  77. #define galsize (256)
  78. #define AlienItems (16)
  79. #define lasttrade AlienItems
  80.  
  81. #define numforLave 7       /* Lave is 7th generated planet in galaxy one */
  82. #define numforZaonce 129
  83. #define numforDiso 147
  84. #define numforRied 46
  85.  
  86. plansys galaxy[galsize]; /* Need 0 to galsize-1 inclusive */
  87.  
  88. seedtype seed;
  89.  
  90. typedef struct
  91. {                         /* In 6502 version these were: */
  92.    uint baseprice;        /* one byte */
  93.    int16 gradient;   /* five bits plus sign */
  94.    uint basequant;        /* one byte */
  95.    uint maskbyte;         /* one byte */
  96.    uint units;            /* two bits */
  97.    char   name[20];         /* longest="Radioactives" */
  98.   } tradegood ;
  99.  
  100.  
  101. typedef struct
  102. {    uint quantity[lasttrade+1];
  103.   uint price[lasttrade+1];
  104. } markettype ;
  105.  
  106. /* Player workspace */
  107. uint     shipshold[lasttrade+1];  /* Contents of cargo bay */
  108. planetnum  currentplanet;           /* Current planet */
  109. uint     galaxynum;               /* Galaxy number (1-8) */
  110. int32    cash;
  111. uint     fuel;
  112. markettype localmarket;
  113. uint     holdspace;
  114.  
  115. int fuelcost =2; /* 0.2 CR/Light year */
  116. int maxfuel =70; /* 7.0 LY tank */
  117.  
  118. const uint16 base0=0x5A4A;
  119. const uint16 base1=0x0248;
  120. const uint16 base2=0xB753;  /* Base seed for galaxy 1 */
  121.  
  122. char pairs[] = "..LEXEGEZACEBISO"
  123.                "USESARMAINDIREA."
  124.                "ERATENBERALAVETI"
  125.                "EDORQUANTEISRION"; /* Dots should be nullprint characters */
  126.  
  127. char govnames[][maxlen]={"Anarchy","Feudal","Multi-gov","Dictatorship",
  128.                     "Communist","Confederacy","Democracy","Corporate State"};
  129.  
  130. char econnames[][maxlen]={"Rich Ind","Average Ind","Poor Ind","Mainly Ind",
  131.                       "Mainly Agri","Rich Agri","Average Agri","Poor Agri"};
  132.  
  133.  
  134. char unitnames[][5] ={"t","kg","g"};
  135.  
  136. /* Data for DB's price/availability generation system */
  137. /*                   Base  Grad Base Mask Un   Name
  138.                      price ient quant     it              */ 
  139.  
  140. #define POLITICALLY_CORRECT    0
  141. /* Set to 1 for NES-sanitised trade goods */
  142.  
  143. tradegood commodities[]=
  144.                    {
  145.                     {0x13,-0x02,0x06,0x01,0,"Food        "},
  146.                     {0x14,-0x01,0x0A,0x03,0,"Textiles    "},
  147.                     {0x41,-0x03,0x02,0x07,0,"Radioactives"},
  148. #if POLITICALLY_CORRECT
  149.                     {0x28,-0x05,0xE2,0x1F,0,"Robot Slaves"},
  150.                     {0x53,-0x05,0xFB,0x0F,0,"Beverages   "},
  151. #else
  152.                     {0x28,-0x05,0xE2,0x1F,0,"Slaves      "},
  153.                     {0x53,-0x05,0xFB,0x0F,0,"Liquor/Wines"},
  154. #endif 
  155.                     {0xC4,+0x08,0x36,0x03,0,"Luxuries    "},
  156. #if POLITICALLY_CORRECT
  157.                     {0xEB,+0x1D,0x08,0x78,0,"Rare Species"},
  158. #else
  159.                     {0xEB,+0x1D,0x08,0x78,0,"Narcotics   "},
  160. #endif 
  161.                     {0x9A,+0x0E,0x38,0x03,0,"Computers   "},
  162.                     {0x75,+0x06,0x28,0x07,0,"Machinery   "},
  163.                     {0x4E,+0x01,0x11,0x1F,0,"Alloys      "},
  164.                     {0x7C,+0x0d,0x1D,0x07,0,"Firearms    "},
  165.                     {0xB0,-0x09,0xDC,0x3F,0,"Furs        "},
  166.                     {0x20,-0x01,0x35,0x03,0,"Minerals    "},
  167.                     {0x61,-0x01,0x42,0x07,1,"Gold        "},
  168.                     {0xAB,-0x02,0x37,0x1F,1,"Platinum    "},
  169.                     {0x2D,-0x01,0xFA,0x0F,2,"Gem-Strones "},
  170.                     {0x35,+0x0F,0xC0,0x07,0,"Alien Items "},
  171.                    };
  172.  
  173. /**-Required data for text interface **/
  174. char tradnames[lasttrade][maxlen]; /* Tradegood names used in text commands
  175.                                       Set using commodities array */
  176.  
  177. #define nocomms 13
  178.  
  179. boolean dobuy(char *);
  180. boolean dosell(char *);
  181. boolean dofuel(char *);
  182. boolean dojump(char *);
  183. boolean docash(char *);
  184. boolean domkt(char *);
  185. boolean dohelp(char *);
  186. boolean dohold(char *);
  187. boolean dosneak(char *);
  188. boolean dolocal(char *);
  189. boolean doinfo(char *);
  190. boolean dogalhyp(char *);
  191. boolean doquit(char *);
  192.  
  193. char commands[nocomms][maxlen]=
  194.   {"buy",        "sell",     "fuel",     "jump",
  195.    "cash",       "mkt",      "help",     "hold",
  196.    "sneak",      "local",    "info",     "galhyp",
  197.      "quit"    
  198.   };
  199.  
  200. boolean (*comfuncs[nocomms])(char *)=
  201.    {dobuy,         dosell,       dofuel,    dojump,
  202.     docash,        domkt,        dohelp,    dohold,
  203.     dosneak,       dolocal,      doinfo,    dogalhyp,
  204.         doquit
  205.   };  
  206.  
  207. /**- General functions **/
  208.  
  209. char randbyte(void)    { return (char)(rand()&0xFF);}
  210.  
  211. uint mymin(uint a,uint b) { if(a<b) return(a);    else return(b);}
  212.  
  213. void stop(char * string)
  214. { printf("\n%s",string);
  215.   exit(1);
  216. }
  217.  
  218.  /**+  ftoi **/
  219. signed int ftoi(double value)
  220. { return ((signed int)floor(value+0.5));
  221. }
  222.  
  223.  /**+  ftoi2 **/
  224. signed int ftoi2(double value)
  225. { return ((signed int)floor(value));
  226. }
  227.  
  228. void tweakseed(seedtype *s)
  229. { uint16 temp;
  230.   temp = ((*s).w0)+((*s).w1)+((*s).w2); /* 2 byte aritmetic */
  231.   (*s).w0 = (*s).w1;
  232.   (*s).w1 = (*s).w2;
  233.   (*s).w2 = temp;
  234. }
  235.  
  236. /**-String functions for text interface **/
  237.  
  238. void stripout(char *s,const char c) /* Remove all c's from string s */
  239. {   size_t i=0,j=0;
  240.     while(i<strlen(s))
  241.     { if(s[i]!=c) { s[j]=s[i]; j++;}
  242.       i++;
  243.     }
  244.     s[j]=0;
  245. }
  246.  
  247. int toupper(char c)
  248. {    if((c>='a')&&(c<='z')) return(c+'A'-'a');
  249.     return((int)c);
  250. }
  251.  
  252.  
  253. int stringbeg(char *s,char *t)
  254. /* Return nonzero iff string t begins with string s */
  255. {    size_t i=0;
  256.   size_t l=strlen(s);
  257.   while((i<l)&(toupper(s[i])==toupper(t[i])))    i++;
  258.   if(i==l) return true; else return false;
  259. }
  260.  
  261. uint stringmatch(char *s,char a[][20],uint n)
  262. /* Check string s against n options in string array a
  263.    If matches ith element return i+1 else return 0 */
  264. {    uint i=0;    
  265.   while(i<n)
  266.   { if(stringbeg(s,a[i])) return i+1;
  267.     i++;
  268.   }
  269. return 0;
  270. }
  271.  
  272. void spacesplit(char *s,char *t)
  273. /* Split string s at first space, returning first 'word' in t & shortening s
  274. */
  275. {   size_t i=0,j=0;
  276.     size_t l=strlen(s);
  277.     while((i<l)&(s[i]==' ')) i++;; /* Strip leading spaces */
  278.     if(i==l) {s[0]=0; t[0]=0; return;};
  279.     while((i<l)&(s[i]!=' ')) t[j++]=s[i++];
  280.     t[j]=0;    i++; j=0;
  281.     while(i<l) s[j++]=s[i++];
  282.     s[j]=0;
  283. }
  284.  
  285. /**-Functions for stock market **/
  286.  
  287. uint gamebuy(uint i, uint a)
  288.  /* Try to buy ammount a  of good i  Return ammount bought */
  289.  /* Cannot buy more than is availble, can afford, or will fit in hold */
  290. {   ui